#include "widget.h"
#include "ui_widget.h"
#include <thread>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 实现“倒计时”的案例，像下面这样写是错误的
    // 因为这是在Widget的构造函数里面，在正式执行程序的时候，我们实现要将Widget构造完毕，然后才能执行show函数，显示出窗口
    // 所以如果这样写，那么Widget的构造则需要等到循环结束后才完成，而且完成后显示出来的数字就已经是0了
//    int val = ui->lcdNumber->intValue();
//    while (true) {
//        // 每次休眠一秒
//        std::this_thread::sleep_for(std::chrono::seconds(1));
//        ui->lcdNumber->display(--val);
//        if (val <= 0) {
//            break;
//        }
//    }

    // 那能不能在构造函数中创建一个线程，然后让新的线程来执行以上的循环操作，从而实现想要的结果呢？
//    std::thread([this](){
//        int val = this->ui->lcdNumber->intValue();
//        while (true) {
//            // 每次休眠一秒
//            std::this_thread::sleep_for(std::chrono::seconds(1));
//            ui->lcdNumber->display(--val);
//            if (val <= 0) {
//                break;
//            }
//        }
//    });

    // 从结果来看， 也还是不行的，会抛出异常
    // 因为在Qt中，界面会有一个专门的程序去负责更新维护(主线程)
    // 对于图形化界面中，其内部包含了很多 隐藏状态，Qt为了保证在修改界面的过程中，线程安全不会受到影响，Qt禁止了其他线程直接修改界面
    // 而对于槽函数来说，默认情况下，槽函数都是走主线程调用的
    // 所以我们通过槽函数来修改界面是没有问题的

}

Widget::~Widget()
{
    delete ui;
}

